<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>序列化对象 － 会话中的对象</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="keyword.parent.html">parent</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="oop4.magic-functions.html">魔术函数 __sleep 和 __wakeup</a></div>
 <div class="up"><a href="oop4.html">类与对象（PHP 4）</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="oop4.serialization" class="sect1">
  <h2 class="title">序列化对象 － 会话中的对象</h2>

  <p class="para">
   <span class="function"><a href="function.serialize.html" class="function">serialize()</a></span>
   返回一个字符串，包含着可以储存于 PHP 的任何值的字节流表示。<span class="function"><a href="function.unserialize.html" class="function">unserialize()</a></span>
   可以用此字符串来重建原始的变量值。用序列化来保存对象可以保存对象中的所有变量。对象中的函数不会被保存，只有类的名称。
  </p>

  <p class="para">
   要能够 <span class="function"><a href="function.unserialize.html" class="function">unserialize()</a></span>
   一个对象，需要定义该对象的类。也就是，如果序列化了
   page1.php 中类 A 的对象 <var class="varname"><var class="varname">$a</var></var>，将得到一个指向类 A
   的字符串并包含有所有 <var class="varname"><var class="varname">$a</var></var> 中变量的值。如果要在
   page2.php 中将其解序列化，重建类 A 的对象
   <var class="varname"><var class="varname">$a</var></var>，则 page2.php 中必须要出现类 A 的定义。例如可以这样实现，将类
   A 的定义放在一个包含文件中，并在 page1.php 和 page2.php 都包含此文件。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;classa.inc:<br />&nbsp;&nbsp;</span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">A&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">$one&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">show_one</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">one</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br /><br /></span><span style="color: #FF8000">//&nbsp;page1.php:<br />&nbsp;&nbsp;</span><span style="color: #007700">include(</span><span style="color: #DD0000">"classa.inc"</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;</span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$s&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">serialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;将&nbsp;$s&nbsp;存放在某处使&nbsp;page2.php&nbsp;能够找到<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$fp&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"store"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"w"</span><span style="color: #007700">);<br />&nbsp;&nbsp;</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$s</span><span style="color: #007700">);<br />&nbsp;&nbsp;</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;page2.php:<br />&nbsp;&nbsp;//&nbsp;为了正常解序列化需要这一行<br />&nbsp;&nbsp;</span><span style="color: #007700">include(</span><span style="color: #DD0000">"classa.inc"</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;</span><span style="color: #0000BB">$s&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">""</span><span style="color: #007700">,&nbsp;@</span><span style="color: #0000BB">file</span><span style="color: #007700">(</span><span style="color: #DD0000">"store"</span><span style="color: #007700">));<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$s</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;现在可以用&nbsp;$a&nbsp;对象的&nbsp;show_one()&nbsp;函数了<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">show_one</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>

  <p class="para">
   如果在用会话并使用了
   <span class="function"><a href="function.session-register.html" class="function">session_register()</a></span>
   来注册对象，这些对象会在每个 PHP
   页面结束时被自动序列化，并在接下来的每个页面中自动解序列化。基本上是说这些对象一旦成为会话的一部分，就能在任何页面中出现。
  </p>

  <p class="para">
   强烈建议在所有的页面中都包括这些注册的对象的类的定义，即使并不是在所有的页面中都用到了这些类。如果没有这样做，一个对象被解序列化了但却没有其类的定义，它将失去与之关联的类并成为
   <strong class="classname">__PHP_Incomplete_Class_Name</strong>
   的一个对象而完全没有任何可用的函数，这样就很没有用处。
  </p>

  <p class="para">
   因此如果在以上的例子中 <var class="varname"><var class="varname">$a</var></var> 通过运行
   <em>session_register(&quot;a&quot;)</em>
   成为了会话的一部分，应该在所有的页面中包含
   <em>classa.inc</em> 文件，而不只是
   page1.php 和 page2.php。
  </p>
 </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="keyword.parent.html">parent</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="oop4.magic-functions.html">魔术函数 __sleep 和 __wakeup</a></div>
 <div class="up"><a href="oop4.html">类与对象（PHP 4）</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
